/*
 * GeneradorArbol.java
 * Clase que parsea las instrucciones y genera el arbol sintactico
 * esta clase fue generada por cocor
 * Ana Silvia Gonzales Torres 10194
 * Diego Alejandro Enriquez Rodriguez 10038
 */
package gramatica;

import arbol.Nodo;

/**
 *
 * @author Ana Silvia Gonzáles
 * @author Diego Enríquez
 */
public class Parser {
	public static final int _EOF = 0;
	public static final int _ID = 1;
	public static final int _INTEGER = 2;
	public static final int _REAL = 3;
	public static final int _DATE = 4;
	public static final int _STRING = 5;
	public static final int maxT = 59;

	static final boolean T = true;
	static final boolean x = false;
	static final int minErrDist = 2;

	public Token t;    // last recognized token
	public Token la;   // lookahead token
	int errDist = minErrDist;
	
	public Scanner scanner;
	public Errors errors;

	private Nodo padre;
public Nodo fatherOfFathers;


	public Parser(Scanner scanner) {
		this.scanner = scanner;
		errors = new Errors();
	}

	void SynErr (int n) {
		if (errDist >= minErrDist) errors.SynErr(la.line, la.col, n);
		errDist = 0;
	}

	public void SemErr (String msg) {
		if (errDist >= minErrDist) errors.SemErr(t.line, t.col, msg);
		errDist = 0;
	}
	
	void Get () {
		for (;;) {
			t = la;
			la = scanner.Scan();
			if (la.kind <= maxT) {
				++errDist;
				break;
			}

			la = t;
		}
	}
	
	void Expect (int n) {
		if (la.kind==n) Get(); else { SynErr(n); }
	}
	
	boolean StartOf (int s) {
		return set[s][la.kind];
	}
	
	void ExpectWeak (int n, int follow) {
		if (la.kind == n) Get();
		else {
			SynErr(n);
			while (!StartOf(follow)) Get();
		}
	}
	
	boolean WeakSeparator (int n, int syFol, int repFol) {
		int kind = la.kind;
		if (kind == n) { Get(); return true; }
		else if (StartOf(repFol)) return false;
		else {
			SynErr(n);
			while (!(set[syFol][kind] || set[repFol][kind] || set[0][kind])) {
				Get();
				kind = la.kind;
			}
			return StartOf(syFol);
		}
	}
	
	void SQL() {
		padre = fatherOfFathers;
		if (StartOf(1)) {
			GeneradorArbol.crearNodo("DDL", padre, la.line, la.col);
			DDL();
		} else if (StartOf(2)) {
			GeneradorArbol.crearNodo("DML", padre, la.line, la.col);
			DML();
		} else SynErr(60);
		while (StartOf(3)) {
			if (StartOf(1)) {
				GeneradorArbol.crearNodo("DDL", padre, la.line, la.col);
				DDL();
			} else {
				GeneradorArbol.crearNodo("DML", padre, la.line, la.col);
				DML();
			}
		}
	}

	void DDL() {
		padre = padre.getLastChild();
		if (la.kind == 7) {
			GeneradorArbol.crearNodo("CREATE", padre, la.line, la.col);
			CREATE();
		} else if (la.kind == 12) {
			GeneradorArbol.crearNodo("ALTER", padre, la.line, la.col);
			ALTER();
		} else if (la.kind == 15) {
			GeneradorArbol.crearNodo("DROP", padre, la.line, la.col);
			DROP();
		} else if (la.kind == 16) {
			GeneradorArbol.crearNodo("USE", padre, la.line, la.col);
			USE();
		} else if (la.kind == 17) {
			GeneradorArbol.crearNodo("SHOW", padre, la.line, la.col);
			SHOW();
		} else SynErr(61);
		GeneradorArbol.crearNodo(";", padre, la.line, la.col);
		Expect(6);
		padre = padre.getParent();
	}

	void DML() {
		padre = padre.getLastChild();
		if (la.kind == 22) {
			GeneradorArbol.crearNodo("INSERT", padre, la.line, la.col);
			INSERT();
		} else if (la.kind == 25) {
			GeneradorArbol.crearNodo("UPDATE", padre, la.line, la.col);
			UPDATE();
		} else if (la.kind == 27) {
			GeneradorArbol.crearNodo("DELETE", padre, la.line, la.col);
			DELETE();
		} else if (la.kind == 28) {
			GeneradorArbol.crearNodo("SELECT", padre, la.line, la.col);
			SELECT();
		} else SynErr(62);
		GeneradorArbol.crearNodo(";", padre, la.line, la.col);
		Expect(6);
		padre = padre.getParent();
	}

	void CREATE() {
		padre = padre.getLastChild();
		GeneradorArbol.crearNodo("CREATE", padre, la.line, la.col);
		Expect(7);
		if (la.kind == 8) {
			GeneradorArbol.crearNodo("DATABASE", padre, la.line, la.col);
			Get();
			GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
			IDLIT();
		} else if (la.kind == 9) {
			GeneradorArbol.crearNodo("TABLE", padre, la.line, la.col);
			Get();
			GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
			IDLIT();
			GeneradorArbol.crearNodo("(", padre, la.line, la.col);
			Expect(10);
			GeneradorArbol.crearNodo("IDTLIST", padre, la.line, la.col);
			IDTLIST();
			if (la.kind == 41 || la.kind == 43 || la.kind == 45) {
				GeneradorArbol.crearNodo("CONSTRAINTS", padre, la.line, la.col);
				CONSTRAINTS();
			}
			GeneradorArbol.crearNodo(")", padre, la.line, la.col);
			Expect(11);
		} else SynErr(63);
		padre = padre.getParent();
	}

	void ALTER() {
		padre = padre.getLastChild();
		GeneradorArbol.crearNodo("ALTER", padre, la.line, la.col);
		Expect(12);
		if (la.kind == 8) {
			GeneradorArbol.crearNodo("DATABASE", padre, la.line, la.col);
			Get();
			GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
			IDLIT();
			GeneradorArbol.crearNodo("RENAME", padre, la.line, la.col);
			Expect(13);
			GeneradorArbol.crearNodo("TO", padre, la.line, la.col);
			Expect(14);
			GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
			IDLIT();
		} else if (la.kind == 9) {
			GeneradorArbol.crearNodo("TABLE", padre, la.line, la.col);
			Get();
			GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
			IDLIT();
			if (la.kind == 13) {
				GeneradorArbol.crearNodo("RENAME", padre, la.line, la.col);
				Get();
				GeneradorArbol.crearNodo("TO", padre, la.line, la.col);
				Expect(14);
				GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
				IDLIT();
			} else if (la.kind == 15 || la.kind == 34) {
				GeneradorArbol.crearNodo("ACTION", padre, la.line, la.col);
				ACTION();
			} else SynErr(64);
		} else SynErr(65);
		padre = padre.getParent();
	}

	void DROP() {
		padre = padre.getLastChild();
		GeneradorArbol.crearNodo("DROP", padre, la.line, la.col);
		Expect(15);
		if (la.kind == 8) {
			GeneradorArbol.crearNodo("DATABASE", padre, la.line, la.col);
			Get();
			GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
			IDLIT();
		} else if (la.kind == 9) {
			GeneradorArbol.crearNodo("TABLE", padre, la.line, la.col);
			Get();
			GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
			IDLIT();
		} else SynErr(66);
		padre = padre.getParent();
	}

	void USE() {
		padre = padre.getLastChild();
		GeneradorArbol.crearNodo("USE", padre, la.line, la.col);
		Expect(16);
		GeneradorArbol.crearNodo("DATABASE", padre, la.line, la.col);
		Expect(8);
		GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
		IDLIT();
		padre = padre.getParent();
	}

	void SHOW() {
		padre = padre.getLastChild();
		GeneradorArbol.crearNodo("SHOW", padre, la.line, la.col);
		Expect(17);
		if (la.kind == 18) {
			GeneradorArbol.crearNodo("DATABASES", padre, la.line, la.col);
			Get();
		} else if (la.kind == 19) {
			GeneradorArbol.crearNodo("TABLES", padre, la.line, la.col);
			Get();
		} else if (la.kind == 20) {
			GeneradorArbol.crearNodo("COLUMNS", padre, la.line, la.col);
			Get();
			GeneradorArbol.crearNodo("FROM", padre, la.line, la.col);
			Expect(21);
			GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
			IDLIT();
		} else SynErr(67);
		padre = padre.getParent();
	}

	void INSERT() {
		padre = padre.getLastChild();
		GeneradorArbol.crearNodo("INSERT", padre, la.line, la.col);
		Expect(22);
		GeneradorArbol.crearNodo("INTO", padre, la.line, la.col);
		Expect(23);
		GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
		IDLIT();
		if (la.kind == 10) {
			GeneradorArbol.crearNodo("(", padre, la.line, la.col);
			Get();
			GeneradorArbol.crearNodo("IDLIST", padre, la.line, la.col);
			IDLIST();
			GeneradorArbol.crearNodo(")", padre, la.line, la.col);
			Expect(11);
		}
		GeneradorArbol.crearNodo("VALUES", padre, la.line, la.col);
		Expect(24);
		GeneradorArbol.crearNodo("(", padre, la.line, la.col);
		Expect(10);
		GeneradorArbol.crearNodo("VALUES", padre, la.line, la.col);
		VALUES();
		GeneradorArbol.crearNodo(")", padre, la.line, la.col);
		Expect(11);
		padre = padre.getParent();
	}

	void UPDATE() {
		padre = padre.getLastChild();
		GeneradorArbol.crearNodo("UPDATE", padre, la.line, la.col);
		Expect(25);
		GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
		IDLIT();
		GeneradorArbol.crearNodo("SET", padre, la.line, la.col);
		Expect(26);
		GeneradorArbol.crearNodo("UPDATES", padre, la.line, la.col);
		UPDATES();
		if (la.kind == 32) {
			GeneradorArbol.crearNodo("WHERE", padre, la.line, la.col);
			WHERE();
		}
		padre = padre.getParent();
	}

	void DELETE() {
		padre = padre.getLastChild();
		GeneradorArbol.crearNodo("DELETE", padre, la.line, la.col);
		Expect(27);
		GeneradorArbol.crearNodo("FROM", padre, la.line, la.col);
		Expect(21);
		GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
		IDLIT();
		if (la.kind == 32) {
			GeneradorArbol.crearNodo("WHERE", padre, la.line, la.col);
			WHERE();
		}
		padre = padre.getParent();
	}

	void SELECT() {
		padre = padre.getLastChild();
		GeneradorArbol.crearNodo("SELECT", padre, la.line, la.col);
		Expect(28);
		if (la.kind == 29) {
			GeneradorArbol.crearNodo("*", padre, la.line, la.col);
			Get();
		} else if (la.kind == 1) {
			GeneradorArbol.crearNodo("IDLIST", padre, la.line, la.col);
			IDLIST();
		} else SynErr(68);
		GeneradorArbol.crearNodo("FROM", padre, la.line, la.col);
		Expect(21);
		GeneradorArbol.crearNodo("IDLIST", padre, la.line, la.col);
		IDLIST();
		if (la.kind == 32) {
			GeneradorArbol.crearNodo("WHERE", padre, la.line, la.col);
			WHERE();
		}
		if (la.kind == 30) {
			GeneradorArbol.crearNodo("ORDER", padre, la.line, la.col);
			Get();
			GeneradorArbol.crearNodo("BY", padre, la.line, la.col);
			Expect(31);
			GeneradorArbol.crearNodo("ORDERS", padre, la.line, la.col);
			ORDERS();
		}
		padre = padre.getParent();
	}

	void IDLIT() {
		padre = padre.getLastChild();
		Expect(1);
		GeneradorArbol.crearNodo(t.val, padre, t.line, t.col);
		padre = padre.getParent();
	}

	void IDTLIST() {
		padre = padre.getLastChild();
		GeneradorArbol.crearNodo("IDMEMBER", padre, la.line, la.col);
		IDMEMBER();
		if (la.kind == 33) {
			GeneradorArbol.crearNodo(",", padre, la.line, la.col);
			Get();
			if (la.kind == 1) {
				GeneradorArbol.crearNodo("IDTLIST", padre, la.line, la.col);
				IDTLIST();
			} else if (StartOf(4)) {
			} else SynErr(69);
		} else if (StartOf(4)) {
		} else SynErr(70);
		padre = padre.getParent();
	}

	void CONSTRAINTS() {
		padre = padre.getLastChild();
		GeneradorArbol.crearNodo("CONSTRAINT", padre, la.line, la.col);
		CONSTRAINT();
		if (la.kind == 33) {
			GeneradorArbol.crearNodo(",", padre, la.line, la.col);
			Get();
			GeneradorArbol.crearNodo("CONSTRAINTS", padre, la.line, la.col);
			CONSTRAINTS();
		} else if (la.kind == 6 || la.kind == 11) {
		} else SynErr(71);
		padre = padre.getParent();
	}

	void ACTION() {
		padre = padre.getLastChild();
		if (la.kind == 34) {
			GeneradorArbol.crearNodo("ADD", padre, la.line, la.col);
			Get();
			if (la.kind == 35) {
				GeneradorArbol.crearNodo("COLUMN", padre, la.line, la.col);
				Get();
				GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
				IDLIT();
				GeneradorArbol.crearNodo("TIPO", padre, la.line, la.col);
				TIPO();
				if (la.kind == 41 || la.kind == 43 || la.kind == 45) {
					GeneradorArbol.crearNodo("CONSTRAINTS", padre, la.line, la.col);
					CONSTRAINTS();
				}
			} else if (la.kind == 41 || la.kind == 43 || la.kind == 45) {
				GeneradorArbol.crearNodo("CONSTRAINT", padre, la.line, la.col);
				CONSTRAINT();
			} else SynErr(72);
		} else if (la.kind == 15) {
			GeneradorArbol.crearNodo("DROP", padre, la.line, la.col);
			Get();
			if (la.kind == 35) {
				GeneradorArbol.crearNodo("COLUMN", padre, la.line, la.col);
				Get();
				GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
				IDLIT();
			} else if (la.kind == 36) {
				GeneradorArbol.crearNodo("CONSTRAINT", padre, la.line, la.col);
				Get();
				GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
				IDLIT();
			} else SynErr(73);
			padre = padre.getParent();
		} else SynErr(74);
	}

	void IDLIST() {
		padre = padre.getLastChild();
		GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
		IDLIT();
		if (la.kind == 33) {
			GeneradorArbol.crearNodo(",", padre, la.line, la.col);
			Get();
			GeneradorArbol.crearNodo("IDLIST", padre, la.line, la.col);
			IDLIST();
		} else if (StartOf(5)) {
		} else SynErr(75);
		padre = padre.getParent();
	}

	void VALUES() {
		padre = padre.getLastChild();
		GeneradorArbol.crearNodo("VALUE", padre, la.line, la.col);
		VALUE();
		if (la.kind == 33) {
			GeneradorArbol.crearNodo(",", padre, la.line, la.col);
			Get();
			GeneradorArbol.crearNodo("VALUES", padre, la.line, la.col);
			VALUES();
		} else if (la.kind == 11) {
		} else SynErr(76);
		padre = padre.getParent();
	}

	void UPDATES() {
		padre = padre.getLastChild();
		GeneradorArbol.crearNodo("UPDAT", padre, la.line, la.col);
		UPDAT();
		if (la.kind == 33) {
			GeneradorArbol.crearNodo(",", padre, la.line, la.col);
			Get();
			GeneradorArbol.crearNodo("UPDATES", padre, la.line, la.col);
			UPDATES();
		} else if (la.kind == 6 || la.kind == 32) {
		} else SynErr(77);
		padre = padre.getParent();
	}

	void WHERE() {
		padre = padre.getLastChild();
		GeneradorArbol.crearNodo("WHERE", padre, la.line, la.col);
		Expect(32);
		GeneradorArbol.crearNodo("EXP", padre, la.line, la.col);
		EXP();
		padre = padre.getParent();
	}

	void ORDERS() {
		padre = padre.getLastChild();
		GeneradorArbol.crearNodo("ORDER", padre, la.line, la.col);
		ORDER();
		if (la.kind == 33) {
			GeneradorArbol.crearNodo(",", padre, la.line, la.col);
			Get();
			GeneradorArbol.crearNodo("ORDERS", padre, la.line, la.col);
			ORDERS();
		} else if (la.kind == 6) {
		} else SynErr(78);
		padre = padre.getParent();
	}

	void EXP() {
		padre = padre.getLastChild();
		if (la.kind == 50) {
			GeneradorArbol.crearNodo("NOT", padre, la.line, la.col);
			Get();
		}
		if (la.kind == 1) {
			GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
			IDLIT();
		} else if (StartOf(6)) {
			GeneradorArbol.crearNodo("VALUE", padre, la.line, la.col);
			VALUE();
		} else SynErr(79);
		GeneradorArbol.crearNodo("REL", padre, la.line, la.col);
		REL();
		if (la.kind == 1) {
			GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
			IDLIT();
		} else if (StartOf(6)) {
			GeneradorArbol.crearNodo("VALUE", padre, la.line, la.col);
			VALUE();
		} else SynErr(80);
		if (la.kind == 56 || la.kind == 57) {
			GeneradorArbol.crearNodo("LOG", padre, la.line, la.col);
			LOG();
			GeneradorArbol.crearNodo("EXP", padre, la.line, la.col);
			EXP();
		}
		padre = padre.getParent();
	}

	void VALUE() {
		padre = padre.getLastChild();
		if (la.kind == 2) {
			GeneradorArbol.crearNodo("INTLIT", padre, la.line, la.col);
			INTLIT();
		} else if (la.kind == 3) {
			GeneradorArbol.crearNodo("FLOATLIT", padre, la.line, la.col);
			FLOATLIT();
		} else if (la.kind == 58) {
			GeneradorArbol.crearNodo("DATELIT", padre, la.line, la.col);
			DATELIT();
		} else if (la.kind == 5) {
			GeneradorArbol.crearNodo("CHARLIT", padre, la.line, la.col);
			CHARLIT();
		} else SynErr(81);
		padre = padre.getParent();
	}

	void INTLIT() {
		padre = padre.getLastChild();
		Expect(2);
		GeneradorArbol.crearNodo(t.val, padre, t.line, t.col);
		padre = padre.getParent();
	}

	void FLOATLIT() {
		padre = padre.getLastChild();
		Expect(3);
		GeneradorArbol.crearNodo(t.val, padre, t.line, t.col);
		padre = padre.getParent();
	}

	void DATELIT() {
		padre = padre.getLastChild();
		GeneradorArbol.crearNodo("'", padre, la.line, la.col);
		Expect(58);
		Expect(4);
		GeneradorArbol.crearNodo(t.val, padre, t.line, t.col);
		GeneradorArbol.crearNodo("'", padre, la.line, la.col);
		Expect(58);
		padre = padre.getParent();
	}

	void CHARLIT() {
		padre = padre.getLastChild();
		Expect(5);
		GeneradorArbol.crearNodo(t.val, padre, t.line, t.col);
		padre = padre.getParent();
	}

	void TIPO() {
		padre = padre.getLastChild();
		if (la.kind == 37) {
			GeneradorArbol.crearNodo("INT", padre, la.line, la.col);
			Get();
		} else if (la.kind == 38) {
			GeneradorArbol.crearNodo("FLOAT", padre, la.line, la.col);
			Get();
		} else if (la.kind == 39) {
			GeneradorArbol.crearNodo("DATE", padre, la.line, la.col);
			Get();
		} else if (la.kind == 40) {
			GeneradorArbol.crearNodo("CHAR", padre, la.line, la.col);
			Get();
			GeneradorArbol.crearNodo("(", padre, la.line, la.col);
			Expect(10);
			GeneradorArbol.crearNodo("INTLIT", padre, la.line, la.col);
			INTLIT();
			GeneradorArbol.crearNodo(")", padre, la.line, la.col);
			Expect(11);
		} else SynErr(82);
		padre = padre.getParent();
	}

	void CONSTRAINT() {
		padre = padre.getLastChild();
		if (la.kind == 41) {
			GeneradorArbol.crearNodo("PRIMARY", padre, la.line, la.col);
			Get();
			GeneradorArbol.crearNodo("KEY", padre, la.line, la.col);
			Expect(42);
			GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
			IDLIT();
			GeneradorArbol.crearNodo("(", padre, la.line, la.col);
			Expect(10);
			GeneradorArbol.crearNodo("IDLIST", padre, la.line, la.col);
			IDLIST();
			GeneradorArbol.crearNodo(")", padre, la.line, la.col);
			Expect(11);
		} else if (la.kind == 43) {
			GeneradorArbol.crearNodo("FOREIGN", padre, la.line, la.col);
			Get();
			GeneradorArbol.crearNodo("KEY", padre, la.line, la.col);
			Expect(42);
			GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
			IDLIT();
			GeneradorArbol.crearNodo("(", padre, la.line, la.col);
			Expect(10);
			GeneradorArbol.crearNodo("IDLIST", padre, la.line, la.col);
			IDLIST();
			GeneradorArbol.crearNodo(")", padre, la.line, la.col);
			Expect(11);
			GeneradorArbol.crearNodo("REFERENCES", padre, la.line, la.col);
			Expect(44);
			GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
			IDLIT();
			GeneradorArbol.crearNodo("(", padre, la.line, la.col);
			Expect(10);
			GeneradorArbol.crearNodo("IDLIST", padre, la.line, la.col);
			IDLIST();
			GeneradorArbol.crearNodo(")", padre, la.line, la.col);
			Expect(11);
		} else if (la.kind == 45) {
			GeneradorArbol.crearNodo("CHECK", padre, la.line, la.col);
			Get();
			GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
			IDLIT();
			GeneradorArbol.crearNodo("(", padre, la.line, la.col);
			Expect(10);
			GeneradorArbol.crearNodo("EXP", padre, la.line, la.col);
			EXP();
			GeneradorArbol.crearNodo(")", padre, la.line, la.col);
			Expect(11);
		} else SynErr(83);
		padre = padre.getParent();
	}

	void IDMEMBER() {
		padre = padre.getLastChild();
		GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
		IDLIT();
		GeneradorArbol.crearNodo("TIPO", padre, la.line, la.col);
		TIPO();
		padre = padre.getParent();
	}

	void ORDER() {
		padre = padre.getLastChild();
		GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
		IDLIT();
		if (la.kind == 46 || la.kind == 47) {
			if (la.kind == 46) {
				GeneradorArbol.crearNodo("ASC", padre, la.line, la.col);
				Get();
			} else {
				GeneradorArbol.crearNodo("DESC", padre, la.line, la.col);
				Get();
			}
		}
		padre = padre.getParent();
	}

	void UPDAT() {
		padre = padre.getLastChild();
		GeneradorArbol.crearNodo("IDLIT", padre, la.line, la.col);
		IDLIT();
		GeneradorArbol.crearNodo("=", padre, la.line, la.col);
		Expect(48);
		if (StartOf(6)) {
			GeneradorArbol.crearNodo("VALUE", padre, la.line, la.col);
			VALUE();
		} else if (la.kind == 49) {
			GeneradorArbol.crearNodo("DEFAULT", padre, la.line, la.col);
			Get();
		} else SynErr(84);
		padre = padre.getParent();
	}

	void REL() {
		padre = padre.getLastChild();
		switch (la.kind) {
		case 51: {
			GeneradorArbol.crearNodo("<", padre, la.line, la.col);
			Get();
			break;
		}
		case 52: {
			GeneradorArbol.crearNodo(">", padre, la.line, la.col);
			Get();
			break;
		}
		case 53: {
			GeneradorArbol.crearNodo("<=", padre, la.line, la.col);
			Get();
			break;
		}
		case 54: {
			GeneradorArbol.crearNodo(">=", padre, la.line, la.col);
			Get();
			break;
		}
		case 55: {
			GeneradorArbol.crearNodo("<>", padre, la.line, la.col);
			Get();
			break;
		}
		case 48: {
			GeneradorArbol.crearNodo("=", padre, la.line, la.col);
			Get();
			break;
		}
		default: SynErr(85); break;
		}
		padre = padre.getParent();
	}

	void LOG() {
		padre = padre.getLastChild();
		if (la.kind == 56) {
			GeneradorArbol.crearNodo("AND", padre, la.line, la.col);
			Get();
		} else if (la.kind == 57) {
			GeneradorArbol.crearNodo("OR", padre, la.line, la.col);
			Get();
		} else SynErr(86);
		padre = padre.getParent();
	}



	public void Parse() {
		la = new Token();
		la.val = "";		
		Get();
		SQL();
		Expect(0);

	}

	private static final boolean[][] set = {
		{T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x},
		{x,x,x,x, x,x,x,T, x,x,x,x, T,x,x,T, T,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x},
		{x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,T,x, x,T,x,T, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x},
		{x,x,x,x, x,x,x,T, x,x,x,x, T,x,x,T, T,T,x,x, x,x,T,x, x,T,x,T, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x},
		{x,x,x,x, x,x,x,x, x,x,x,T, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,T,x,T, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x},
		{x,x,x,x, x,x,T,x, x,x,x,T, x,x,x,x, x,x,x,x, x,T,x,x, x,x,x,x, x,x,T,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x},
		{x,x,T,T, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,T,x, x}

	};
} // end Parser


class Errors {
	public int count = 0;                                    // number of errors detected
	public java.io.PrintStream errorStream = System.out;     // error messages go to this stream
	public String errMsgFormat = "-- line {0} col {1}: {2}"; // 0=line, 1=column, 2=text
	
	protected void printMsg(int line, int column, String msg) {
		StringBuffer b = new StringBuffer(errMsgFormat);
		int pos = b.indexOf("{0}");
		if (pos >= 0) { b.delete(pos, pos+3); b.insert(pos, line); }
		pos = b.indexOf("{1}");
		if (pos >= 0) { b.delete(pos, pos+3); b.insert(pos, column); }
		pos = b.indexOf("{2}");
		if (pos >= 0) b.replace(pos, pos+3, msg);
		//errorStream.println(b.toString());
                gramatica.GeneradorArbol.setNoError(false);
                gui.GUI.error(b.toString() + "\r\n");
	}
	
	public void SynErr (int line, int col, int n) {
		String s;
		switch (n) {
			case 0: s = "EOF expected"; break;
			case 1: s = "ID expected"; break;
			case 2: s = "INTEGER expected"; break;
			case 3: s = "REAL expected"; break;
			case 4: s = "DATE expected"; break;
			case 5: s = "STRING expected"; break;
			case 6: s = "\";\" expected"; break;
			case 7: s = "\"CREATE\" expected"; break;
			case 8: s = "\"DATABASE\" expected"; break;
			case 9: s = "\"TABLE\" expected"; break;
			case 10: s = "\"(\" expected"; break;
			case 11: s = "\")\" expected"; break;
			case 12: s = "\"ALTER\" expected"; break;
			case 13: s = "\"RENAME\" expected"; break;
			case 14: s = "\"TO\" expected"; break;
			case 15: s = "\"DROP\" expected"; break;
			case 16: s = "\"USE\" expected"; break;
			case 17: s = "\"SHOW\" expected"; break;
			case 18: s = "\"DATABASES\" expected"; break;
			case 19: s = "\"TABLES\" expected"; break;
			case 20: s = "\"COLUMNS\" expected"; break;
			case 21: s = "\"FROM\" expected"; break;
			case 22: s = "\"INSERT\" expected"; break;
			case 23: s = "\"INTO\" expected"; break;
			case 24: s = "\"VALUES\" expected"; break;
			case 25: s = "\"UPDATE\" expected"; break;
			case 26: s = "\"SET\" expected"; break;
			case 27: s = "\"DELETE\" expected"; break;
			case 28: s = "\"SELECT\" expected"; break;
			case 29: s = "\"*\" expected"; break;
			case 30: s = "\"ORDER\" expected"; break;
			case 31: s = "\"BY\" expected"; break;
			case 32: s = "\"WHERE\" expected"; break;
			case 33: s = "\",\" expected"; break;
			case 34: s = "\"ADD\" expected"; break;
			case 35: s = "\"COLUMN\" expected"; break;
			case 36: s = "\"CONSTRAINT\" expected"; break;
			case 37: s = "\"INT\" expected"; break;
			case 38: s = "\"FLOAT\" expected"; break;
			case 39: s = "\"DATE\" expected"; break;
			case 40: s = "\"CHAR\" expected"; break;
			case 41: s = "\"PRIMARY\" expected"; break;
			case 42: s = "\"KEY\" expected"; break;
			case 43: s = "\"FOREIGN\" expected"; break;
			case 44: s = "\"REFERENCES\" expected"; break;
			case 45: s = "\"CHECK\" expected"; break;
			case 46: s = "\"ASC\" expected"; break;
			case 47: s = "\"DESC\" expected"; break;
			case 48: s = "\"=\" expected"; break;
			case 49: s = "\"DEFAULT\" expected"; break;
			case 50: s = "\"NOT\" expected"; break;
			case 51: s = "\"<\" expected"; break;
			case 52: s = "\">\" expected"; break;
			case 53: s = "\"<=\" expected"; break;
			case 54: s = "\">=\" expected"; break;
			case 55: s = "\"<>\" expected"; break;
			case 56: s = "\"AND\" expected"; break;
			case 57: s = "\"OR\" expected"; break;
			case 58: s = "\"\\\'\" expected"; break;
			case 59: s = "??? expected"; break;
			case 60: s = "invalid SQL"; break;
			case 61: s = "invalid DDL"; break;
			case 62: s = "invalid DML"; break;
			case 63: s = "invalid CREATE"; break;
			case 64: s = "invalid ALTER"; break;
			case 65: s = "invalid ALTER"; break;
			case 66: s = "invalid DROP"; break;
			case 67: s = "invalid SHOW"; break;
			case 68: s = "invalid SELECT"; break;
			case 69: s = "invalid IDTLIST"; break;
			case 70: s = "invalid IDTLIST"; break;
			case 71: s = "invalid CONSTRAINTS"; break;
			case 72: s = "invalid ACTION"; break;
			case 73: s = "invalid ACTION"; break;
			case 74: s = "invalid ACTION"; break;
			case 75: s = "invalid IDLIST"; break;
			case 76: s = "invalid VALUES"; break;
			case 77: s = "invalid UPDATES"; break;
			case 78: s = "invalid ORDERS"; break;
			case 79: s = "invalid EXP"; break;
			case 80: s = "invalid EXP"; break;
			case 81: s = "invalid VALUE"; break;
			case 82: s = "invalid TIPO"; break;
			case 83: s = "invalid CONSTRAINT"; break;
			case 84: s = "invalid UPDAT"; break;
			case 85: s = "invalid REL"; break;
			case 86: s = "invalid LOG"; break;
			default: s = "error " + n; break;
		}
		printMsg(line, col, s);
		count++;
	}

	public void SemErr (int line, int col, String s) {	
		printMsg(line, col, s);
		count++;
	}
	
	public void SemErr (String s) {
		//errorStream.println(s);
                gramatica.GeneradorArbol.setNoError(false);
                gui.GUI.error(s + "\r\n");
		count++;
	}
	
	public void Warning (int line, int col, String s) {	
		printMsg(line, col, s);
	}
	
	public void Warning (String s) {
		//errorStream.println(s);
                gramatica.GeneradorArbol.setNoError(false);
                gui.GUI.error(s + "\r\n");
	}
} // Errors


class FatalError extends RuntimeException {
	public static final long serialVersionUID = 1L;
	public FatalError(String s) { super(s); }
}
